package com.iqiyi.pps.epg.core.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iqiyi.kiwi.message.Message;
import com.iqiyi.kiwi.message.impl.MessageImpl;
import com.iqiyi.kiwi.utils.Configuration;
import com.iqiyi.pps.epg.core.message.MQServiceImpl;
import com.iqiyi.pps.epg.core.model.program.CategoryData;
import com.iqiyi.pps.epg.core.model.program.ProgramData;
import com.iqiyi.pps.epg.core.model.program.ProgramDataBase;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by karkarrotxu on 2016/12/1.
 */
public class ApiMqUtils {
    private static MQServiceImpl service = null;
    public static final String ACTIVEMQ_VV_TOPIC_NAME = Configuration.getString("activemq.vv.topic.name");
    private static Logger logger = LoggerFactory.getLogger(ApiMqUtils.class);

    private ApiMqUtils() {
    }


    private static synchronized MQServiceImpl getService() {
        if (service == null) {
            service = (MQServiceImpl) ApplicationContextUtil.getBean("messageService");
        }
        return service;
    }

    //   索引名称：pgcliveprogram   主键：qipuId
//  ?  programStatus	string	节目状态 （WAITING：未开始 LIVE_TYPE：直播 REQUEST_TYPE：点播 REPLAY_TYPE：回看 EXCEPTION：异常结束 FORCE_END：强制终止 END：结束 ABANDON：废弃）
//  ?  uid	long	用户ID
//    qipuId	long	奇谱ID
//    payStatus	integer	付费类型 （0：免费 1：付费未划价 2：付费已划价）
//  ?  liveId	string	直播ID
//    createTime	long	节目创建时间
// ?   imgProductStatus	integer	图片生产状态 （0：调用生产失败 1：生产中 2：生产完成 3：生产失败）
//    startPlayTime	long	节目开始时间
//  ?  showInLiveCenter	integer	是否进入直播中心 （0：不进入 1：进入）
//    isTest	integer	是否是测试用户 （0： 不是 1： 是）
//    recommendRate	integer	推荐等级 （0：不推荐 1：普通推荐 2：重点推荐 3:强烈推荐）
//  ?  channelId	integer	频道ID
//    isTypeShop	integer	电商直播标志位  （0： 非电商直播  1：电商直播）
//    isTypeIpd	integer	爱频道标志位 （0：非爱频道直播 1：爱频道直播）
//    liveType	integer	直播类型 （1：移动端直播 2：第三方直播）
//    liveDuration	integer	节目时长 （单位秒）
//    streamWay	integer	直播方式 （1：推流 2：拉流）
//    referrer	integer	推荐人（未启用）
//    deleteFlag	integer	节目删除标志位 （0：未删除， 1： 删除）
//    nickName	string	用户昵称
//    programName	string	节目名称
//    type	integer	待扩展， 区分PPC和PGC  （0：PGC, 1:PPC）
//chatSwitch  integer (0:开 , 1:关)
    private static String accountStatus(ProgramData programData) {
        ProgramData.calPlayStatus(programData);
        switch (programData.getPlayStatus()) {
            case ProgramData.PST_WAITING:
                return "WAITING";
            case ProgramData.PST_LIVE:
                return "LIVE_TYPE";
            case ProgramData.PST_REPLAY:
                return "REPLAY_TYPE";
            case ProgramData.PST_REQUEST:
                return "END";
        }
        return "";
    }

    public static JSONObject getVVObject(ProgramData program, List<ProgramDataBase> dataBaseList) {
        JSONObject entity = new JSONObject();
        entity.put("qipuId", program.getQipuId());
        entity.put("programName", program.getPname());
        entity.put("startPlayTime", program.getStartPlayTime().getTime());
        entity.put("stopPlayTime", program.getStopPlayTime().getTime());
        entity.put("liveDuration", program.getStopPlayTime().getTime() / 1000 - program.getStartPlayTime().getTime() / 1000);
        entity.put("deleteFlag", program.getDeleteFlag());
        entity.put("payStatus", transBossStatus(program.getBossStatus()));
        entity.put("createTime", program.getAddTime().getTime());
        entity.put("chatSwitch", program.getChatEnable() == 1 ? 0 : 1);
        if (program.getChatRoomId() > 0) {
            entity.put("chatId", program.getChatRoomId());
        }
        entity.put("showInLiveCenter", program.getHot());
        entity.put("type", 1);
        entity.put("isSubscribe", program.getSubscribe());
        entity.put("isTest", program.getTest());
        entity.put("recommendRate", program.getRecommendRate());
        entity.put("imgProductStatus", StringUtils.isNotBlank(program.getDefaultLogoUrl()) ? 2 : 1);
        entity.put("uid", null);
        entity.put("nickName", "");
        entity.put("liveTag", "");
        entity.put("programStatus", accountStatus(program));
        if (dataBaseList.size() > 1) {
            long uid = 0;
            String nickName = null;
            try {
                for (ProgramDataBase programDataBase : dataBaseList) {
                    if (programDataBase.getType() == 301) {
                        uid = Long.valueOf(programDataBase.getValue());
                    } else if (programDataBase.getType() == 302) {
                        nickName = programDataBase.getValue();
                    }
                }
                if (uid > 0 && nickName != null && nickName.length() > 0) {
                    entity.put("uid", uid);
                    entity.put("nickName", nickName);
                } else {
                    logger.info("[getVVObject error][programId={}][passport id = {}][nickName={}]", program.getId(), uid, nickName);
                }
            } catch (Exception e) {
                logger.error("[getVVObject][programId=" + program.getId() + "]", e);
            }
        }
        if (StringUtils.isNotBlank(program.getCategory())) {
            try {
                StringBuffer sBuilder = new StringBuffer();
                List<CategoryData> nodeList = JSONArray.parseArray(program.getCategory(), CategoryData.class);
                for (CategoryData node : nodeList) {
                    if (node.getDataMode() == 1) {
                        sBuilder.append(node.getId() * 100 + 33 + ",");
                    } else if (node.getLevel() == 1) {
                        entity.put("channelId", node.getId());
                    }
                }
                if (sBuilder.length() > 0) {
                    entity.put("liveTag", sBuilder.deleteCharAt(sBuilder.length() - 1));
                }
            } catch (Exception e) {
                logger.error("[getVVObject][Category error][programId=" + program.getId() + "]", e);
            }
        }
        return entity;
    }

    public static int transBossStatus(String bossStatus) {
        switch (bossStatus) {
            case ProgramData.FREE:
                return 0;
            case ProgramData.PAIED_NOT_AVAILABLE:
                return 1;
            case ProgramData.PAIED_AVAILABLE:
                return 2;
            default:
                return 0;
        }
    }

    //* 写直播节目索引
    public static void sendVVNotify(String jsonObj) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("indexName", "pgcliveprogram");
        map.put("keyField", "qipuId");
        map.put("insertWhileNoHitting", "1");
        map.put("entity", jsonObj);
        map.put("actionType", "0");
        Message message = new MessageImpl();
        message.setDelay(0);
        message.setMap(map);
        message.setDestination(ACTIVEMQ_VV_TOPIC_NAME);
        getService().send(message);
    }
}
